﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using SSPharma.Biz.DanhMuc;
using SSPharma.Common;
using System.Data;
using SSPharma.View.TimKiem;

namespace SSPharma.View.DanhMuc
{
    /// <summary>
    /// Interaction logic for frmTyGia.xaml
    /// </summary>
    public partial class frmTyGia : Window
    {
       
        #region valible
        //dataset dung de luu  dữ liệu xuống database
        private DataSet dsData;
        private DataTable dtDeleted;
        // enum dùng để lưu trữ trạng thái mode form
        private UtilityUIElement.FormMode isModeHeader;
        private UtilityUIElement.FormMode isModeLine;
        // khai báo đối tượng BizDanhMucTyGia
        private BizDanhMucTyGiaHeader _BizDanhMucTyGia;
        private LibraryFunctionFind _LibraryFunctionFind;
        //datarow dùng để lấy dữ liệu và gán dữ liệu
        private DataRow drHeader;
        private DataRow drLine;
        // lấy controll đang được chọn hiện tại
        private string controlName;
        // biến counter
        private string Counter;
        // from name
        private string FormName;
        //// add a delegate
        public delegate void IdentityValues();
        //// add an event of the delegate type
        public event IdentityValues IdentityValue;
        
        #endregion

        #region contructor
        /// <summary>
        /// contructor tham số chuyền vào là mã tỷ giá
        /// </summary>
        /// <param name="Id"></param>
        public frmTyGia(string Id)
        {
            InitializeComponent();
            _BizDanhMucTyGia = new BizDanhMucTyGiaHeader();
            _LibraryFunctionFind = new LibraryFunctionFind();
            FormName = "HT_DM_TyGiaHeader";
            try
            {
                this.BeginMode();
                this.EditMode();
                GetDataDanhMucTyGiaTheoMa(Id);
            }
            catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }
        }
        /// <summary>
        /// User:TAMNN 21/07/2014
        /// Contructor mac dinh
        /// </summary>
        public frmTyGia()
        {
            InitializeComponent();
            _BizDanhMucTyGia = new BizDanhMucTyGiaHeader();
            _LibraryFunctionFind = new LibraryFunctionFind();
            FormName = "HT_DM_TyGiaHeader";
            try
            {
                this.BeginMode();
                this.NewMode();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }
        }
        #endregion

        #region Các Hàm Mode form
        /// <summary>
        /// User:TAMNN ; 18/07/2014
        /// Mục đích: chạy khi bắt đầu vào form
        /// </summary>
        private void BeginMode()
        {
            this.EnableControl(false);
            this.GetCauTrucData();
            dtDeleted = dsData.Tables["dt_TyGiaLine"].Clone();
        }
        /// <summary>
        /// User:TAMNN ; 18/07/2014
        /// Mục đích: chạy khi có mã chứng từ
        /// </summary>
        private void EditMode()
        {
            isModeHeader = UtilityUIElement.FormMode.EditMode;
            this.EnableControl(true);
            this.dptNgayLap.Focus();
        }
        /// <summary>
        /// User:TAMNN ; 18/07/2014
        /// Mục đích: thêm mới form
        /// </summary>
        private void NewMode()
        {
            this.ResetTemp();
            this.isModeHeader = UtilityUIElement.FormMode.NewMode;
            this.EnableControl(true);
            this.dsData.Tables["dt_TyGiaHeader"].Rows.Clear();
            this.dsData.Tables["dt_TyGiaLine"].Rows.Clear();
            this.dsData.Tables["dt_TyGiaHeader"].AcceptChanges();
            this.dsData.Tables["dt_TyGiaLine"].AcceptChanges();
            this.drHeader = this.dsData.Tables["dt_TyGiaHeader"].NewRow();
            this.dsData.Tables["dt_TyGiaHeader"].Rows.Add(drHeader);
            this.GetCounter();
            DataTable dt = _BizDanhMucTyGia.ft_GetDataTyGiaHomTruoc();
            dt.TableName = "dt_TyGiaLine";
            dsData.Tables.Remove(dsData.Tables["dt_TyGiaLine"]);
            dsData.Tables.Add(dt);
            this.SetDefaulControl();
            this.dptNgayLap.Focus();
        }
        /// <summary>
        ///  User:TAMNN ; 18/07/2014
        ///  Mục đích: save xong dữ liệu thì gọi để đổ lại dữ liệu cho các controll
        /// </summary>
        private void SaveMode()
        {
            isModeHeader = UtilityUIElement.FormMode.EditMode;
            this.EnableControl(true);
            this.dptNgayLap.Focus();
            DataTable dt = _BizDanhMucTyGia.ft_GetDataDanhMucTyGiaHeaderTheoMa(txtMaSoTyGia.Text);// lấy dữ liệu theo mã
            dt.TableName = "dt_TyGiaHeader";
            this.dsData.Tables.Remove(this.dsData.Tables["dt_TyGiaHeader"]);
            this.dsData.Tables.Add(dt);
            dt = _BizDanhMucTyGia.ft_GetDataDanhMucTyGiaLineTheoMa(txtMaSoTyGia.Text);// lấy dữ liệu theo mã
            dt.TableName = "dt_TyGiaLine";
            this.dsData.Tables.Remove(this.dsData.Tables["dt_TyGiaLine"]);
            this.dsData.Tables.Add(dt);
            drHeader = dsData.Tables["dt_TyGiaHeader"].Rows[0];
            UtilityUIElement.ElementToControl(drHeader, this.LayoutRoot.Children);
            gTyGia.DataContext = dsData.Tables["dt_TyGiaLine"].AsDataView();
        }
        #endregion

        #region Event
        /// <summary>
        /// User:TAMNN; 18/07/2014
        /// Cập nhật dữ liệu
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCapNhat_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            try
            {
                bool p_bResult = false;
                string Message = string.Empty;
                this.CheckDataBeforeSave(ref Message, ref p_bResult);
                if (!string.IsNullOrEmpty(Message))
                {
                    MessageBox.Show(Message, "SSPharma");
                    return;
                }
                this.GetDataBeforeSave();//lấy dữ liệu trước khi lưu
                if (isModeHeader == UtilityUIElement.FormMode.NewMode)//Nếu là thêm mới
                {
                    if (p_bResult)// nếu như mã đó đã có
                    {
                        if (MessageBox.Show("Mã tỷ giá đã tồn tại.\n Bạn có muốn chương trình sẽ tự động tăng mã tiếp theo không ?", "SSPharma", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
                        {
                            _BizDanhMucTyGia.fg_InsertDanhMucTyGia(dsData, Counter);
                            MessageBox.Show("Thêm thành công!");
                        }
                    }
                    else//ngược lại tạo mã tỷ giá rồi lưu dữ liệu bình thường
                    {
                        _BizDanhMucTyGia.fg_InsertDanhMucTyGia(dsData, Counter);
                        MessageBox.Show("Thêm thành công!");
                    }
                }
                else// ngược lại là cập nhật dữ liệu
                {
                    _BizDanhMucTyGia.fg_UpdateDanhMucTyGia(dsData);
                    MessageBox.Show("Cập nhật thành công!");
                }
                this.SaveMode();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }
        }
        /// <summary>
        /// User:TAMNN; 18/07/2014
        /// Nút thoát form
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnThoat_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            try
            {
                this.IdentityValue();
                this.Close();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }
        }
        /// <summary>
        /// User: TAMNN; 18/07/2014
        /// Thoát form
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_Closed(object sender, System.EventArgs e)
        {
            try
            {
                this.IdentityValue();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }
        }
        /// <summary>
        /// sự kiện bàn phím cho form hiện tại
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key == Key.F5)
            {
                var focusedControl = FocusManager.GetFocusedElement(this);
                string p_sStoreName = string.Empty,p_sParams = string.Empty, p_sValues = string.Empty;
                Control control = (Control)focusedControl;
                controlName = control.Name;
                if (controlName.Equals("txtMaNganHang"))
                {
                    LibraryFunctionFind.StringTimKiemNganHang(ref p_sStoreName, ref p_sParams, ref p_sValues);
                    FunctionShowForm(p_sStoreName, p_sParams, p_sValues);
                }
            }
        }
        private void gTyGia_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            #region Xóa dòng trên lưới
            if (((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) && e.Key == Key.Delete)
            {
                var dataGrid = (DataGrid)sender;
                var result = MessageBox.Show("Bạn muốn thực hiện việc xóa dòng này?", "SSPharma", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.Yes);
                e.Handled = (result == MessageBoxResult.No);// Handled = true là dừng lại. false là tiếp tục
                if (!e.Handled)
                {
                    int selected = dataGrid.SelectedIndex;
                    int num = this.dsData.Tables["TB_TyGiaLine"].Rows.Count;
                    if (selected != num)
                    {
                        this.drLine = this.dsData.Tables["TB_TyGiaLine"].Rows[selected];
                        if (drLine.RowState == DataRowState.Modified)
                        {
                            dsData.Tables["TB_TyGiaLine"].Rows[selected].RejectChanges();
                            this.dtDeleted.ImportRow(drLine);
                        }
                        else if (drLine.RowState == DataRowState.Added)
                        {
                            dsData.Tables["TB_TyGiaLine"].Rows[selected].AcceptChanges();
                        }
                        else
                        {
                            dsData.Tables["TB_TyGiaLine"].Rows[selected].AcceptChanges();
                            this.dtDeleted.ImportRow(drLine);
                        }

                        this.dsData.Tables["TB_TyGiaLine"].Rows.RemoveAt(selected);
                    }
                }
            }
            #endregion
            
            #region Tìm kiếm
            else if (e.Key == Key.F5)
            {
                string p_sStoreName = string.Empty, p_sParams = string.Empty, p_sValues = string.Empty;
                controlName = gTyGia.CurrentCell.Column.SortMemberPath;
                if (controlName.Equals("MaLoaiTien") || controlName.Equals("TenLoaiTien"))
                {
                    LibraryFunctionFind.StringTimKiemNganHang(ref p_sStoreName, ref p_sParams, ref p_sValues);
                    FunctionShowForm(p_sStoreName, p_sParams, p_sValues);
                }
            }
            #endregion
            
            #region Forcus dòng tiếp theo
            if (e.Key == Key.Enter || e.Key == Key.Return)
            {
                // get the selected row
                var selectedRow = gTyGia.ItemContainerGenerator.ContainerFromItem(gTyGia.SelectedItem) as DataGridRow;

                // selectedRow can be null due to virtualization
                if (selectedRow != null)
                {
                    // there should always be a selected cell
                    if (gTyGia.SelectedCells.Count != 0)
                    {
                        // get the cell info
                        DataGridCellInfo currentCell = gTyGia.CurrentCell;

                        // get the display index of the cell's column + 1 (for next column)
                        int columnDisplayIndex = currentCell.Column.DisplayIndex +1;

                        // if display index is valid
                        if (columnDisplayIndex < gTyGia.Columns.Count)
                        {
                            // get the DataGridColumn instance from the display index
                            DataGridColumn nextColumn = gTyGia.ColumnFromDisplayIndex(columnDisplayIndex);

                            // now telling the grid, that we handled the key down event
                            e.Handled = true;

                            // setting the current cell (selected, focused)
                            gTyGia.CurrentCell = new DataGridCellInfo(gTyGia.SelectedItem, nextColumn);
                            // tell the grid to initialize edit mode for the current cell
                            gTyGia.BeginEdit();
                        }
                    }
                }
            }
            #endregion
        }
        private void gTyGia_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if ((((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) && ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)) && (e.Key == Key.I))
            {
                var dataGrid = (DataGrid)sender;
                int selected = dataGrid.SelectedIndex;
                DataTable dt = dsData.Tables["TB_TyGiaLine"];
                DataRow dr = dt.NewRow();
                dt.Rows.InsertAt(dr, selected);
                gTyGia.SelectedIndex = selected;
            }
        }
        private void gTyGia_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            e.Row.Header = (e.Row.GetIndex() + 1).ToString();
        }
        private void gTyGia_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
            try
            {
                var ft = sender;
                if (controlName == "MaLoaiTien")
                {
                    DataRowView drv = gTyGia.SelectedValue as DataRowView;
                    drv["TenLoaiTien"] = _BizDanhMucTyGia.ft_GetTenLoaiTienTheoMa(drv["MaLoaiTien"].ToString());
                }
            }
            catch (Exception ex) { }
        }
        #endregion

        #region Utility function
        /// <summary>
        /// User: TAMNN; 18/07/2014
        /// lấy mã tỷ giá
        /// </summary>
        public void GetCounter()
        {
            string counter = this._BizDanhMucTyGia.fs_LayCongToTuDong(Counter);
            if (!string.IsNullOrEmpty(counter))
            {
                txtMaSoTyGia.Text = counter;
            }
            else
                throw new System.Configuration.Provider.ProviderException("Không lấy được Mã tỷ giá");
        }
        /// <summary>
        /// User: TAMNN; 18/07/2014
        /// lấy cấu trúc table trong sql để thực hiện thêm, xóa, sửa dữ liệu
        /// </summary>
        private void GetCauTrucData()
        {
            dsData = _BizDanhMucTyGia.fs_LayCauTrucTable(FormName);
            if (dsData.Tables["dt_Default"].Rows.Count > 0 && dsData.Tables["dt_Default"].Rows[0]["TenCot"].ToString() == "Counter")
                Counter = dsData.Tables["dt_Default"].Rows[0]["GiaTri"].ToString();
        }
        /// <summary>
        /// User: TAMNN; 18/07/2014
        /// lấy dữ liệu trước khi lưu
        /// </summary>
        private void GetDataBeforeSave()
        {
            UtilityUIElement.ControlToElement(ref this.drHeader, this.LayoutRoot.Children);
            drHeader["ModifiedDate"] = LibraryFormatConverter.ConvertStringDDMMYYYYHHMMSSToYYYYMMDDHHMMSS(LibraryFormatConverter.SetStringDateTimeDefault);
            drHeader["ModifiedBy"] = Global.UserName;
            foreach (DataRow row in dsData.Tables["dt_TyGiaLine"].Rows)
            {

                if (string.IsNullOrEmpty(row["TyGia"].ToString()) || Convert.ToDouble(row["TyGia"].ToString()) == 0)
                    row.AcceptChanges();
                else 
                {
                    row["MaSoTyGia"] = drHeader["MaSoTyGia"];
                    row["ModifiedDate"] = LibraryFormatConverter.ConvertStringDDMMYYYYHHMMSSToYYYYMMDDHHMMSS(LibraryFormatConverter.SetStringDateTimeDefault);
                    row["ModifiedBy"] = Global.UserName;
                    if (row.RowState == DataRowState.Added)
                    {
                        row["CreatedDate"] = LibraryFormatConverter.ConvertStringDDMMYYYYHHMMSSToYYYYMMDDHHMMSS(LibraryFormatConverter.SetStringDateTimeDefault);
                        row["CreatedBy"] = Global.UserName;
                    }
                }
            }
            if (this.isModeHeader == UtilityUIElement.FormMode.NewMode)
            {
                drHeader["CreatedDate"] = LibraryFormatConverter.ConvertStringDDMMYYYYHHMMSSToYYYYMMDDHHMMSS(LibraryFormatConverter.SetStringDateTimeDefault);
                drHeader["CreatedBy"] = Global.UserName;
                this.dsData.Tables["dt_TyGiaHeader"].Rows[0].AcceptChanges();// chuyển trạng thái về Unchange
                this.dsData.Tables["dt_TyGiaHeader"].Rows[0].SetAdded();// set lai trang thai la Added
            }

            // Kiểm tra đã xóa những dòng nào
            int num = this.dsData.Tables["dt_TyGiaLine"].Rows.Count - 1;
            for (int i = this.dtDeleted.Rows.Count - 1; i >= 0; i--)
            {
                this.dsData.Tables["dt_TyGiaLine"].ImportRow(this.dtDeleted.Rows[i]);
                num++;
                this.dsData.Tables["dt_TyGiaLine"].Rows[num].AcceptChanges();
                this.dsData.Tables["dt_TyGiaLine"].Rows[num].Delete();
            }

        }
        /// <summary>
        /// User: TAMNN; 18/07/2014
        /// Lấy tỷ giá theo mã tỷ giá
        /// </summary>
        /// <param name="strMa"></param>
        private void GetDataDanhMucTyGiaTheoMa(string strMa)
        {
            DataTable dt = _BizDanhMucTyGia.ft_GetDataDanhMucTyGiaHeaderTheoMa(strMa);// lấy dữ liệu theo mã
            dt.TableName = "dt_TyGiaHeader";
            this.dsData.Tables.Remove(this.dsData.Tables["dt_TyGiaHeader"]);
            this.dsData.Tables.Add(dt);
            dt = _BizDanhMucTyGia.ft_GetDataDanhMucTyGiaLineTheoMa(strMa);// lấy dữ liệu theo mã
            dt.TableName = "dt_TyGiaLine";
            this.dsData.Tables.Remove(this.dsData.Tables["dt_TyGiaLine"]);
            this.dsData.Tables.Add(dt);
            drHeader = dsData.Tables["dt_TyGiaHeader"].Rows[0];
            UtilityUIElement.ElementToControl(drHeader, this.LayoutRoot.Children);
            gTyGia.DataContext = dsData.Tables["dt_TyGiaLine"].AsDataView();
        }
        /// <summary>
        /// User: TAMNN; 18/07/2014
        /// xóa toàn bộ dữ liệu trên các controll
        /// </summary>
        private void ResetTemp()
        {
            UtilityUIElement.BlankControlText(this.LayoutRoot.Children);
        }
        /// <summary>
        /// User: TAMNN; 18/07/2014
        /// kiểm tra các cột bắt buộc và các cột tính toán đúng hay sai.
        /// </summary>
        /// <returns></returns>
        private void CheckDataBeforeSave(ref string Message, ref bool p_bResult)
        {
            if (string.IsNullOrEmpty(dptNgayLap.Text))
            {
                Message = Message + "Chọn ngày lập" + "\n";
            }
            if (string.IsNullOrEmpty(txtMaNganHang.Text))
            {
                Message = Message + "Nhập Mã ngân hàng" + "\n";
            }
            if (dsData.Tables["dt_TyGiaLine"].Rows.Count==0)
            {
                Message = Message + "Không có chi tiết" + "\n";
            }
            //foreach (DataRow row in this.dsData.Tables["dt_TyGiaLine"].Rows)
            //{
            //    if (Convert.to row["TyGia"] == "")
            //    {
            //        Message = Message + "" + " \n";
            //    }
            //}
            if (isModeHeader == UtilityUIElement.FormMode.NewMode)
                // kiểm tra xem code id đó đã được lưu hay chưa
                p_bResult = _BizDanhMucTyGia.fb_KiemTraSoCounter(txtMaSoTyGia.Text, Counter,"","",DateTime.Now.Year.ToString(),DateTime.Now.Month.ToString());
        }
        /// <summary>
        /// User: TAMNN; 18/07/2014
        /// ẩn hiện controll
        /// </summary>
        /// <param name="isEnable"></param>
        private void EnableControl(bool isEnable)
        {
            UtilityUIElement.Enable_Control(isEnable, this.LayoutRoot.Children);
            txtMaSoTyGia.IsEnabled = false;
        }
        /// <summary>
        /// User: TAMNN; 18/07/2014
        /// gán các giá trị mặc định cho các controll
        /// </summary>
        private void SetDefaulControl()
        {
            dptNgayLap.Text = DateTime.Now.ToString("dd/MM/yyyy");
            gTyGia.DataContext = dsData.Tables["dt_TyGiaLine"].AsDataView();
            chkTyGiaMacDinh.IsChecked = true;
            //chkTyGiaHomTruoc.IsChecked = true;
        }

        #region Hàm dùng cho tìm kiếm form
        private void FunctionShowForm(string p_sStoreName, string p_sParams,string p_sValues)
        {
            var formKeySearch = new frmTimKiem(p_sStoreName,p_sParams, p_sValues);
            formKeySearch.IdentityValue += new frmTimKiem.IdentityValues(Search_Form);
            formKeySearch.ShowDialog();
        }
        /// <summary>
        /// User: TAMNN 11/08/2014
        /// Mục đích: lấy dữ liệu trả về của form search
        /// </summary>
        /// <param name="keyReturn"></param>
        private void Search_Form(string keyReturn)
        {
            string str = keyReturn;
            DataRowView drv ;
            switch (controlName)
            {
                case "txtMaNganHang":
                    txtMaNganHang.Text = str;
                    txtTenNganHang.Text = _BizDanhMucTyGia.ft_GetTenNganHangTheoMa(str);// lấy dữ liệu theo mã
                    break;
                case "MaLoaiTien":
                    drv = gTyGia.SelectedValue as DataRowView;
                    drv["MaLoaiTien"] = str;
                    drv["TenLoaiTien"] = _BizDanhMucTyGia.ft_GetTenLoaiTienTheoMa(str);
                    DataGridCellInfo currentCell = gTyGia.CurrentCell;
                    int columnDisplayIndex = currentCell.Column.DisplayIndex;
                    DataGridColumn nextColumn = gTyGia.ColumnFromDisplayIndex(columnDisplayIndex);
                    gTyGia.CurrentCell = new DataGridCellInfo(gTyGia.SelectedItem, nextColumn);
                    gTyGia.BeginEdit();
                    break;
                case "TenLoaiTien":
                    drv = gTyGia.SelectedValue as DataRowView;
                    drv["MaLoaiTien"] = str;
                    drv["TenLoaiTien"] = _BizDanhMucTyGia.ft_GetTenLoaiTienTheoMa(str);
                    currentCell = gTyGia.CurrentCell;
                    columnDisplayIndex = currentCell.Column.DisplayIndex;
                    nextColumn = gTyGia.ColumnFromDisplayIndex(columnDisplayIndex);
                    gTyGia.CurrentCell = new DataGridCellInfo(gTyGia.SelectedItem, nextColumn);
                    gTyGia.BeginEdit();
                    break;
            }
        }
        #endregion
        #endregion

        #region Tính toán
        
        #endregion
    }
}
